package global

import (
	"bytes"
	"encoding/json"
	"fmt"

	"gitee.com/night-tc/gobige/common"
	"gitee.com/night-tc/gobige/logger"
	"gitee.com/night-tc/gobige/redislib"
)

/*
本包用与全服务器都需要获取的一些数据信息
主要是给框架内需要使用的一些数据
*/

var (
	//服务器
	srvinst IsrvInst
	//服务器配置
	srvcfginst ISrvConfig
	// redis连接池
	redisMap map[string]*redislib.RedisAccess
)

// 服务器级状态单例
func GetSrvInst() IsrvInst {
	return srvinst
}

func SetSrvInst(inst IsrvInst) IsrvInst {
	srvinst = inst
	return inst
}

// 服务器实例配置 单例
func GetCfgInst() ISrvConfig {
	if srvcfginst == nil {
		initConfig()
	}
	return srvcfginst
}

func SetCfgInst(inst ISrvConfig) ISrvConfig {
	srvcfginst = inst
	return srvcfginst
}

// redis连接池 单例 获取
func GetRedisAccess(key string) *redislib.RedisAccess {
	if result, ok := redisMap[key]; ok {
		return result
	} else {
		panic(fmt.Sprintf("GetRedisAccess key:%s not found", key))
	}
}

// redis连接池 单例 获取
func GetRedisConn(key string) *redislib.RedisHandleModel {
	return GetRedisAccess(key).GetConn()
}

func SetRedisByName(name string, v *redislib.RedisAccess) {
	if redisMap == nil {
		redisMap = make(map[string]*redislib.RedisAccess)
	}
	redisMap[name] = v
}

// 打印服务器配置信息
func PrintConfig() {
	data, _ := json.Marshal(srvcfginst)
	var str bytes.Buffer
	_ = json.Indent(&str, []byte(data), "", "    ")
	logger.Infof("PrintConfig %s", str.String())
}

var (
	// 请求超时
	Err_TimeOut = common.NewError(-1, "timeout")
)
